import router from './router'
import store from './store' // 引入store实例 和组件中的this.$store等价
import { Message } from 'element-ui' // 引入elementui消息提示组件
import NProgress from 'nprogress' // 进度条
import 'nprogress/nprogress.css' // 进度条样式
import { getToken } from '@/utils/auth' // 从cookies中获取令牌
import getPageTitle from '@/utils/get-page-title'// 获取页面标题

NProgress.configure({ showSpinner: false }) // NProgress 配置

const whiteList = ['/login', '/404'] // 无重定向白名单

router.beforeEach(async(to, from, next) => {
  // 启动进度条
  NProgress.start()

  // 设置页面标题
  document.title = getPageTitle(to.meta.title)

  // 确定用户是否已登录
  const hasToken = getToken()

  if (hasToken) {
    if (to.path === '/login') {
      // 如果已登录，进入login将重定向到主页
      // 有token进入登录页无需获取用户信息
      next({ path: '/' })
      NProgress.done()
    } else {
      // 如果已登录，判断是否有用户资料
      const hasGetUserInfo = store.getters.name // 使用用户名称进行判断
      if (hasGetUserInfo) {
        // 如果有用户资料，则直接放行
        next()
      } else {
        // 如果无用户资料，则获取用户资料
        try {
          // 获取用户信息,并保存到Vuex中
          const userInfo = await store.dispatch('user/getUserInfo')
          console.log(userInfo.roles.menus)
          // getUserInfo是异步函数，需要使用await修饰，否则可能导致还没有获取到用户资料时就直接放行
          const routes = await store.dispatch('permission/filterRouters', userInfo.roles.menus)// 筛选得到当前用户可用的动态路由
          console.log(routes)
          // 动态路由添加到路由表中
          // 404页必须放在末尾!!!
          router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }])// 相当于跳转到对应的地址，多做一次跳转
          next(to.path)
        } catch (error) {
          // 被动介入
          // 如果获取用户信息失败,可能是token超时，则删除用户信息。
          // 删除令牌并转到登录页面重新登录
          await store.dispatch('user/logout')
          Message.error(error || '获取用户信息失败，将跳转至登录页')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else {
    // 没有token令牌

    if (whiteList.indexOf(to.path) > -1) {
      // 在登录白名单中，直接进入
      next()
    } else {
      // 其他没有访问权限的页面将重定向到登录页面。
      next(`/login?redirect=${to.path}`)
      // 完成进度条
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // 完成进度条
  NProgress.done()
})
